package com.girl.controller;


import com.girl.properties.GirlProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

@RestController
/**
 * controller注解是用来处理Http请求
 * RestController是Spring4之后新加的注解，这个注解等于controller加上ResponseBody这两个注解
 */
public class HelloController {


    /**
     * @value的注解是比较初级的，如果需要配置很多个属性，可以参考第二种做法
     * 写一个properties类，
     * @Component
     * @ConfigurationProperties(prefix = "girl")
     * 然后写上对应的get set方法，这样springboot在启动的时候就能够直接为properties类扫描并且自动加载属性，
     * 我们可以直接在其余类中使用自动装配注入
     */
    @Autowired
    private GirlProperties girl;

//    @Value("${cupSize}")
//    private String cupSize;
//
//    @Value("${age}")
//    private Integer age;
//
//    @Value("${context}")
//    private String context;

    /**
     * getMapping代表直接是get请求，同理还有postMapping和putMapping等
     * @return
     */
    @GetMapping("/getGirl")
    public GirlProperties getGirl(){
//        这里会直接返回{"age":18,"cupSize":"B"}，因为上面使用的注解是restController
     return girl;
    }

//    @GetMapping("/getCup")
//    public String getCup(){
//        return cupSize;
//    }

    /**
     * requestMapping注解是映射一个url路径，可以直接加在类上面，方便代码管理，
     * 而且路径映射中可以直接使用一个集合@RequestMapping(value = {"/hello","hi"}
     * 如果注解后面不加method，这样就会支持所有类型请求，get和post都支持
     * @return
     */
    @RequestMapping(value = "/hello" ,method = RequestMethod.GET)
    public String sayHello(){
        return "hello,spring boot";
    }

    /**
     * @PathVariable是用来获得请求url中的动态参数的
     * @RequestParam的用法
     *  1、可以对传入参数指定参数名，如果前端不传入paramName=value，则程序会报错
     *  2、可以通过required=false或者true来要求@RequestParam配置的前端参数是否一定要传
     *  3、如果用@RequestMapping注解的参数是int基本类型，但是required=false，这时如果不
     *      传参数值会报错，因为不传值，会赋值为null给int，这个不可以
     *  4：可以设置default，设置参数的默认值，如果required设置为false了，那么就可以不传入参数
     *      这个时候使用default设置一个默认值，能够避免程序报错
     *
     */
    @RequestMapping("/getId/{id}")
    public int getId(@PathVariable int id){
        /**
         * 这种传参方式可以直接是localhost:8080/getId/1,意思是传入的id值是1
         */
        return id;
    }
    @RequestMapping("/getId2")
    public int getId2(@RequestParam(value = "id",required = false,defaultValue ="0" ) int id){
        /**
         * 这种传参方式是必须localhost:8080/getId2?id=1
         * 这里的requires=false意思是不是必传参数，如果为true，就是id这个参数必传
         */
        return id;
    }

    @RequestMapping("/getId3")
    public int getId3(int id){
        /**
         * 这也是一种传参方法，spring会自动根据参数名字封装进入，我们可以直接拿这个参数名来用
         */
        return id;
    }

}
